遗传算法优化神经网络小车自动寻路走出迷宫(1)基于OpenGL的基本框架

之前简单地学习了神经网络相关的知识,回想起了之前在B站上看到的小车自动在迷宫寻路的视频(还有用类似方法解决flappy bird的视频:https://www.bilibili.com/video/av13940007/?from=search&seid=8284022935044659565),就寻思着利用神经网络的知识自己也写一个出来。

其实其结构并不用非常复杂,可以先考虑小车上有几个传感器,可以计算小车在不同方向上距离边界的距离。而寻路的算法就是确定一个函数,将这几个距离作为输入,输出一个0到1的数字即可,大于0.5为左转,否则为右转。并且神经网络用一个隐藏层即可,这样就可以近似出一个确定左转还是右转的函数(神经网络的本质就是对一个分类函数的近似)。

接下来让我不知所措的是这个问题的训练集到底是什么,因为不同于之前我博客写过的很简单的平面点分类问题,这个函数我们事先并不知道,而作为当前输入的唯一可评价的输出就是小车是否到达了终点,仅凭这些是无法训练神经网络的。

后来我逐渐明白了,这其实是一种无监督学习,因为我们并没有事先标记好的样例来供神经网络来学习。之后我突然想起了遗传算法这个东西,所以去学习了一下,发现其思想和结构都十分适合这种模型。接下来的文章就是通过具体的代码实现这样一个学习程序以及其可视化的动画。


动画的话我只在学校学过opengl所以就现学现用了。

首先需要安装python上的OpenGL,这个在百度查就可以了。由于OpenGL的实现都有单独的函数,所以在python上的语法跟C语言几乎没有区别。在这里我利用python建立了Lines和Rectangles两个类分别用于画出边界和小车。

这是需要引用的库

import OpenGL.GL
import OpenGL.GLU
import OpenGL.GLUT

from math import tan
from math import atan
from math import pi
from math import sqrt
from math import sin
from math import cos
from math import hypot

from OpenGL.GL import *

from OpenGL.GLU import *
from OpenGL.GLUT import *

import time

这是Lines的代码

class Lines:
    startx=0
    starty=0
    endx=0
    endy=0
    def __init__(self, sx, sy, ex, ey, r, g, b):
        self.startx=sx
        self.starty=sy
        self.endx=ex
        self.endy=ey
        self.r=r
        self.g=g
        self.b=b
    
    def Display(self):
        glColor3f(self.r, self.g, self.b)
        glBegin(GL_LINE_STRIP)
        glVertex2f(self.startx,self.starty)
        glVertex2f(self.endx,self.endy)
        glEnd()

对于我来说,画出迷宫边界最简单的方式就是利用多条的折线,这样方便于自定义迷宫的形状。

这是Rectangles的代码

class Rectangles:
    centerx=0
    centery=0
    length=0
    width=0
    angle=0
    startcenterx=0
    startcentery=0
    startangle=0
    starttime=0
    def __init__(self,cx,cy,l,w,a,r,g,b):
        self.centerx=cx
        self.centery=cy
        self.startcenterx=cx
        self.startcentery=cy
        self.length=l
        self.width=w
        self.angle=a
        self.startangle=a
        self.r=r
        self.g=g
        self.b=b
        self.starttime=time.time()
        
    def Display(self):
        glColor3f(self.r, self.g, self.b)
        glBegin(GL_QUADS);
        glVertex2f(self.centerx+self.length*cos(self.angle)/2-self.width*sin(self.angle)/2,self.centery+self.length*sin(self.angle)/2+self.width*cos(self.angle)/2);
        glVertex2f(self.centerx-self.length*cos(self.angle)/2-self.width*sin(self.angle)/2,self.centery-self.length*sin(self.angle)/2+self.width*cos(self.angle)/2);
        glVertex2f(self.centerx-self.length*cos(self.angle)/2+self.width*sin(self.angle)/2,self.centery-self.length*sin(self.angle)/2-self.width*cos(self.angle)/2);
        glVertex2f(self.centerx+self.length*cos(self.angle)/2+self.width*sin(self.angle)/2,self.centery+self.length*sin(self.angle)/2-self.width*cos(self.angle)/2);
        glEnd();
    
    def Move(self,movex,movey):
        self.centerx+=movex
        self.centery+=movey
    
    def Rotate(self,direc,a):
        leftanchorvx=self.centerx-4*self.width*sin(self.angle)
        leftanchorvy=self.cent
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
【国外优秀项目】 神经网络(Neural Networks)、卷积神经网络(Convolutional Neural Networks, CNNs)和遗传算法(Genetic Algorithms, GAs)是人工智能领域的三种不同技术,它们各自有不同的应用和特点。 1. **神经网络(Neural Networks)**: 神经网络是一种受人脑启发的计算模型,它由大量的节点(或称为“神经元”)组成,这些节点通常分层排列。神经网络通过学习从输入到输出的映射关系来解决各种问题,如分类、回归和模式识别。神经网络的学习过程通常涉及调整节点之间的连接权重,以最小化预测输出与实际输出之间的差异。 2. **卷积神经网络(Convolutional Neural Networks, CNNs)**: CNNs是一种特殊类型的神经网络,专门用于处理具有已知网格状拓扑的数据,如图像。CNNs的核心是卷积层,它通过在输入数据上滑动小的滤波器(或称为“卷积核”)来提取特征。这些特征随后被传递到网络的后续层进行进一步的处理。CNNs在图像识别、视频分析、医学图像处理等领域表现出色。 3. **遗传算法(Genetic Algorithms, GAs)**: GAs是一种模拟自然选择和遗传机制的搜索算法。它们通常用于优化和搜索问题。遗传算法通过模拟生物进化过程中的选择、交叉(杂交)和变异等操作来演化出问题的解决方案。GAs从一个可能解的种群开始,通过迭代过程不断改进解的质量,直到找到满意的解决方案或达到预定的停止条件。 这三种技术可以独立使用,也可以结合使用。例如,神经网络和CNNs通常用于模式识别和预测问题,而遗传算法可以用于优化神经网络的结构或参数。在某些情况下,遗传算法甚至可以用来训练神经网络

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值